package dao;

import business.EmpregadoException;
import java.util.ArrayList;
import java.util.List;
import model.Empregado;

public class EmpregadoDAO extends BaseDAO<Empregado> {
	
    private static EmpregadoDAO instancia;
    private static List<Empregado> listaEmpregados = null;

    /**
     * Método executado para garantir a existência de apenas uma instância dessa classe (Singleton).
     * 
     * @return uma instância da classe EmprestimoBO
     * 
     */
    public static EmpregadoDAO getInstance() {
        if (instancia == null) {
            instancia = new EmpregadoDAO();
            listaEmpregados = new ArrayList<Empregado>();
        }
        return instancia;
    }

    /**
     * Método executado para incluir determinado empregado na lista de empregados.
     * 
     * @param empregado
     * @throws Exception
     * 
     */
    @Override
    public void incluir(Empregado empregado) throws Exception {
        listaEmpregados.add(empregado);
    }

    /**
     * Método executado para remover o antigo empregado e adicionar o empregado alterado novamente na lista.
     * 
     * @param antigoEmpregado que é o empregado que será removido
     * @param novoEmpregado que é o empregado que será adicionado
     * @throws Exception
     * 
     */
    @Override
    public void alterar(Empregado antigoEmpregado, Empregado novoEmpregado) throws Exception {
        listaEmpregados.remove(antigoEmpregado);
        listaEmpregados.add(novoEmpregado);
    }

    /**
     * Método executado para excluir determinado empregado na lista de empregados.
     * 
     * @param empregado
     * @throws Exception
     * 
     */
    @Override
    public void excluir(Empregado empregado) throws Exception {
        listaEmpregados.remove(empregado);
    }

    /**
     * Método executado para listar todos os empregados.
     * 
     * @return Lista de empregados
     * @throws Exception
     * 
     */
    @Override
    public List<Empregado> listar() throws Exception {
        return listaEmpregados;
    }

    /**
     * Método executado para retornar um empregado dado seu identificador.
     * 
     * @param id
     * @return empregado
     * @throws Exception
     * 
     */
    public Empregado consultar(Long id) throws Exception {
        return listaEmpregados.get(id.intValue());
    }

    /**
     * Método executado para verificar se o CPF entrado corresponde
     * ao CPF de algum empregado previamente cadastrado.
     *
     * @param Empregado
     * @return O empregado em si
     *
     */
    public Empregado consultaEmpregadoPorCpf(String cpf) throws EmpregadoException, Exception {

        for (int i = 0; i < listaEmpregados.size(); i++) {
            if (cpf.equals(listaEmpregados.get(i).getCpf())) {
                return listaEmpregados.get(i);
            }
        }

        throw new EmpregadoException("Não há nenhum empregado cadastrado com esse CPF.");

    }

    /**
     * Método executado para verificar igualdade de determinado empregado na lista de empregados.
     * 
     * @param Empregado a ser consultado
     * @return Lista com todos os empregados semelhantes a ele
     * @throws Exception
     * 
     */
    public List<Empregado> consultaEmpregado(Empregado empregadoConsultado) throws Exception {

        List<Empregado> listaEmpregadosConsultados = new ArrayList<Empregado>();

        for (int i = 0; i < listaEmpregados.size(); i++) {

            if (!empregadoConsultado.getNome().equals("")) {
                if (!empregadoConsultado.getNome().equals(listaEmpregados.get(i).getNome()))
                        continue;
            }

            if (empregadoConsultado.getSexo() != null) {
                if (empregadoConsultado.getSexo() != listaEmpregados.get(i).getSexo())
                        continue;
            }

            if (empregadoConsultado.getSalario() != null) {
                if (empregadoConsultado.getSalario().compareTo(listaEmpregados.get(i).getSalario()) != 0)
                        continue;
            }

            if (!empregadoConsultado.getCpf().equals("")) {
                if (!empregadoConsultado.getCpf().equals(listaEmpregados.get(i).getCpf()))
                        continue;
            }

            if (!empregadoConsultado.getDataNascimento().equals("")) {
                if (!empregadoConsultado.getDataNascimento().equals(listaEmpregados.get(i).getDataNascimento()))
                        continue;
            }

            if (!empregadoConsultado.getDataAdmissao().equals("")) {
                if (!empregadoConsultado.getDataAdmissao().equals(listaEmpregados.get(i).getDataAdmissao()))
                        continue;
            }

            if (!empregadoConsultado.getDataDesligamento().equals("")) {
                if (!empregadoConsultado.getDataDesligamento().equals(listaEmpregados.get(i).getDataDesligamento()))
                        continue;
            }

            listaEmpregadosConsultados.add(listaEmpregados.get(i));

        }

        return listaEmpregadosConsultados;

    }
}
